#ifndef COMMON_H
#define COMMON_H

#include <string>
#include <vector>

using namespace std;

namespace Zen{namespace utility{

class output_debug_string_position
{
public:
	output_debug_string_position(const string& file, int line,  const string& function);

	void operator()(const char* format, ...);

	void operator()(const wchar_t* format, ...);

private:
	string file_, function_;
	int line_;
};

}}

//////////////////////////////////////////////////////////////////////////

namespace Zen{namespace utility{

#define ODS output_debug_string_position(__FILE__, __LINE__, __FUNCTION__)

	void output_debug_string(const char* format, ...);

	void output_debug_string(const wchar_t* format, ...);

	void init_random();

	string random_password(int n);

	std::string get_exe_dir(int uplevel = 0);

	/*
	 *	
	 */
	tstring get_parent_dir_path(const tstring& path);

	tstring get_parent_dir_name(const tstring& path);

	tstring get_path_filename(const tstring& path);

	tstring get_path_extension(const tstring& path);

	tstring get_path_fullname(const tstring& path);

	bool init_socket();

	void uninit_socket();

	std::string get_host(const char *dn);


	/*
	 * convert a byte array to hex string.	"1234abc" => "31323334656667"
	 * hex string format example:"AF B0 80 7D"
	 */
	string bytes_to_hex_string(const string& src);

	/*
	 * convert a hex string to a byte array. "31323334656667" => "1234abc"
	 * hex string format example:"AF B0 80 7D"
	 */
	string hex_string_to_byte(const string& src);

	bool execute_dos_cmd(const string& cmd, string& output);

}}

#endif
